<?php
/**
 * 空的对象
 * 
 * 从0.0.3起，空对象可以使用两种方式访问和设置属性：
 * - $object->x->y->z
 * - $object["x"]["y"]["z"]
 * 而且它们的本质是一样的.
 *
 * @version $Id: IEmptyObject.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.core
 * @since 0.0.2
 */
class IEmptyObject extends IObject implements ArrayAccess,IIterable {
	private $properties = array();
	
	/**
	 * 调用未定义属性时激活的方法
	 *
	 * @param string $varname 调用的属性名
	 * @return IEmptyObject
	 * @since 0.0.2
	 */
	public function __get($varname) {
		if (array_key_exists($varname, $this->properties)) {
			return $this->properties[$varname];
		}
		else {
			return $this->properties[$varname] = new IEmptyObject();
		}
	}
	
	/**
	 * 设置未定义属性时调用的方法
	 *
	 * @param string $varname 属性名
	 * @param mixed $value 属性值
	 * @since 0.0.3
	 */
	public function __set($varname, $value) {
		$this->properties[$varname] = $value;
	}
	
	/**
	 * 将对象转换成字符串
	 * 
	 * 恒定返回""
	 *
	 * @return string
	 * @since 0.0.2
	 */
	public function __toString() {
		return "";
	}
	
	/**
	 * 使用isset判断未定义属性时激活的方法
	 *
	 * @param string $varname 调用的属性名
	 * @return boolean
	 * @since 0.0.2
	 */	
	public function __isset($varname) {
		$varname;
		return true;
	}
	
	/**
	 * 判断键是否存在
	 * 
	 * 使用 isset($object[$key]) 时激活
	 *
	 * @param mixed $key 键
	 * @return boolean
	 * @since 0.0.3
	 */
	public function offsetExists($key) {
		$key;
		return true;
	}
	
	/**
	 * 取得键的值
	 * 
	 * 使用 echo $object[$key] 时激活
	 *
	 * @param mixed $key 键
	 * @return mixed
	 * @since 0.0.3
	 */
	public function offsetGet($key) {
		return $this->__get($key);
	}
	
	
	/**
	 * 设置键的值
	 * 
	 * 使用 $object[$key] = $value; 时激活
	 *
	 * @param mixed $key 键
	 * @param mixed $item 键的值
	 * @since 0.0.3
	 */	
	public function offsetSet($key, $item) {
		$this->properties[$key] = $item;
	}
	
	/**
	 * 销毁键对应的元素
	 * 
	 * 使用 unnset($object[$key]) 时激活
	 *
	 * @param mixed $key 键
	 * @since 0.0.3
	 */
	public function offsetUnset($key) {
		unset($this->properties[$key]);
	}
	
	/**
	 * Enter description here...
	 *
	 * @return unknown
	 * @since 0.1
	 */
	public function getIterator() {
		return new IMapIterator($this->properties);
	}
	
	/**
	 * Enter description here...
	 *
	 * @return unknown
	 * @since 0.1
	 */
	public function toArray() {
		return $this->properties;
	}
}

?>